package br.ufrn.sipac.patrimonio.coletor.controller;

import java.sql.SQLException;
import java.util.Collection;
import java.util.List;

import android.content.Context;
import br.ufrn.sipac.patrimonio.auxiliares.StatusLevantamento;
import br.ufrn.sipac.patrimonio.coletor.dao.GenericDaoORM;
import br.ufrn.sipac.patrimonio.coletor.dominio.Levantamento;
import br.ufrn.sipac.patrimonio.coletor.dominio.Persistencia;
import br.ufrn.sipac.patrimonio.coletor.exception.DatabaseException;
import br.ufrn.sipac.patrimonio.coletor.helper.DatabaseHelper;

/**
 * Controla o acesso as consulta feitas no banco de dados da aplicação.
 * 
 * @author Giuliana Silva Bezerra
 * 
 */
public class DatabaseController {
	public static Collection<Persistencia> getAllFinalidades(Context context)
			throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getFinalidadeDAO()
					.queryForAll();
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static Persistencia findUnidadeById(Context context, Integer id)
			throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getUnidadeDAO()
					.queryForId(id);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static Collection<Persistencia> findLocalidadesByUnidade(
			Context context, Integer idUnidade) throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getLocalidadeDAO()
					.queryForEq("id_unidade", idUnidade);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static Collection<Persistencia> findAllUnidades(Context context)
			throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getUnidadeDAO()
					.queryForAll();
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static List<Persistencia> findBemByTombo(Context context,
			Integer tombo) throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getBemDAO()
					.queryForEq("numTombamento", tombo);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static Persistencia findLocalidadeById(Context context,
			Integer idLocalidade) throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getLocalidadeDAO()
					.queryForId(idLocalidade);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static Persistencia findUsuarioById(Context context,
			Integer idUsuario) throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getUsuarioDAO()
					.queryForId(idUsuario);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static List<Persistencia> getAllLevantamentos(Context context)
			throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getLevantamentoDAO()
					.queryForAll();
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static Persistencia findFinalidadeById(Context context,
			Integer idFinalidade) throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getFinalidadeDAO()
					.queryForId(idFinalidade);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static Collection<Persistencia> findItensByLevantamento(
			Context context, Integer idLevantamento) throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getItemDAO()
					.queryForEq("id_levantamento", idLevantamento);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static Persistencia findBemById(Context context, Integer idBem)
			throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getBemDAO()
					.queryForId(idBem);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	/**
	 * Grava localmente o levantamento e os itens associados.
	 * 
	 * @param levantamento
	 * @param bens
	 * @throws SQLException
	 */
	public static void gravarLevantamento(Context context,
			Levantamento levantamento, Collection<Persistencia> bens)
			throws DatabaseException {
		// Cria o levantamento
		try {
			DatabaseHelper.getHelper(context).getLevantamentoDAO()
					.create(levantamento);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static int capturarMaiorId(Class class1, Context context)
			throws DatabaseException {
		GenericDaoORM<Persistencia> dao;
		try {
			dao = new GenericDaoORM<Persistencia>(context, class1);
			return dao.capturarMaiorId(class1, context);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static void create(Persistencia obj, Context context)
			throws DatabaseException {
		try {
			GenericDaoORM<Persistencia> dao = new GenericDaoORM<Persistencia>(
					context, (Class<Persistencia>) obj.getClass());
			dao.save(obj);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static void updateItemLevantamento(Persistencia obj, Context context)
			throws DatabaseException {
		try {
			DatabaseHelper.getHelper(context).getItemDAO().update(obj);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static Collection<Persistencia> findBensByUnidade(int idUnidade,
			Context context) throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getBemDAO()
					.queryForEq("id_unidade", idUnidade);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static Collection findItensPorLevantamento(int idLevantamento,
			Context context) throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getItemDAO()
					.queryForEq("id_levantamento", idLevantamento);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static Collection findUnidadeByCodigo(long codigo, Context context)
			throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getUnidadeDAO()
					.queryForEq("codigo_unidade", codigo);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static List<Persistencia> getLevantamentosPendentes(Context context)
			throws DatabaseException {
		try {
			return DatabaseHelper.getHelper(context).getLevantamentoDAO()
					.queryForEq("status", StatusLevantamento.PENDENTE);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}

	public static void updateLevantamento(Levantamento levantamento,
			Context context) throws DatabaseException {
		try {
			DatabaseHelper.getHelper(context).getLevantamentoDAO()
					.update(levantamento);
		} catch (SQLException e) {
			throw new DatabaseException(e.getMessage(), context);
		}
	}
}
